import { DJ, DJ_TYPE } from "./Enums";

interface DjCount {
    c: number; // 货币类型使用计数
    v: number; // 视频类型使用计数
}

export class DjManger {
    // 使用限制，c和v分别代表不同类型的限制数量
    private static dj_limit_: DjCount[] = [
        { c: 2, v: 2 },
        { c: 2, v: 2 },
        { c: 2, v: 2 },
        { c: 2, v: 2 },
        { c: 2, v: 2 },
    ];

    // 当前使用计数
    private static dj_cur_: DjCount[] = [
        { c: 0, v: 0 },
        { c: 0, v: 0 },
        { c: 0, v: 0 },
        { c: 0, v: 0 },
        { c: 0, v: 0 },
    ];

    /** 打印当前限制与使用情况，调试用 */
    static log_dj() {
        console.log("dj limit >>", this.dj_limit_);
        console.log("dj current >>", this.dj_cur_);
    }

    /**
     * 根据按钮类型和资源类型尝试使用，返回是否允许使用
     * @param btn DJ.Btn_1 ~ DJ.Btn_5
     * @param type DJ_TYPE.Type_coin | DJ_TYPE.Type_video
     */
    static use_dj(btn: string, type: string): boolean {
        const index = this.getBtnIndex(btn);
        if (index === -1) return false;

        const ourData = this.dj_cur_[index];
        const limitData = this.dj_limit_[index];

        if (type === DJ_TYPE.Type_coin) {
            if (ourData.c >= limitData.c) return false;
            ourData.c++;
            return true;
        }
        if (type === DJ_TYPE.Type_video) {
            if (ourData.v >= limitData.v) return false;
            ourData.v++;
            return true;
        }
        return false;
    }

    /**
     * 返还使用次数，避免误用时扣除
     * @param btn 按钮类型
     * @param type 资源类型
     */
    static return_used_dj(btn: string, type: string): void {
        const index = this.getBtnIndex(btn);
        if (index === -1) return;

        const ourData = this.dj_cur_[index];
        if (type === DJ_TYPE.Type_coin && ourData.c > 0) {
            ourData.c--;
        }
        if (type === DJ_TYPE.Type_video && ourData.v > 0) {
            ourData.v--;
        }
    }

    /** 重置当前使用计数 */
    static reset_dj_cur_() {
        this.dj_cur_.forEach(e => {
            e.c = 0;
            e.v = 0;
        });
    }

    /** 根据按钮获取数组索引 */
    private static getBtnIndex(btn: string): number {
        switch (btn) {
            case DJ.Btn_1: return 0;
            case DJ.Btn_2: return 1;
            case DJ.Btn_3: return 2;
            case DJ.Btn_4: return 3;
            case DJ.Btn_5: return 4;
            default: return -1;
        }
    }
}
